「程式世界很簡單,只有兩種狀態:True 或 False。」
「但問題是,怎麼判斷哪個是真的、哪個是假的呢?」
在前幾天的學習中,我們先認識了 變數與資料型別,知道可以把不同型別的資料存放到變數裡。
昨天(Day6)則玩了各種數字、文字的運算對吧!
但是,程式並不只要會算,它還要能「判斷」。
想想看,這些問題是不是更貼近「現實生活」:
畢竟程式的出現,就是要解決日常生活中的困擾吧?
今天,我們就要正式進入 關係與邏輯判斷的世界。
我們會先認識 (關係)比較運算子,用來比較大小、檢查相等;
再學習 邏輯運算子,用來組合多個條件。
這些工具將會是未來 if 條件判斷 的基石,讓程式能夠根據不同情況做出選擇。
| 運算子 | 說明 | 範例 | 結果 | 
|---|---|---|---|
| == | 等於 | 5 == 5 | True | 
| != | 不等於 | 5 != 3 | True | 
| > | 大於 | 7 > 4 | True | 
| >= | 大於或等於 | 7 >= 7 | True | 
| < | 小於 | 3 < 8 | True | 
| <= | 小於或等於 | 3 <= 2 | False | 
| in | 是否存在於序列中 | 'a' in 'cat' | True | 
| not in | 是否不存在於序列 | 'z' not in 'cat' | True | 
| is | 是否指向同一個物件 | x is y | 視情況 | 
| is not | 是否不是同一物件 | x is not y | 視情況 | 
= vs ==初學者最常遇到的 bug,就是搞錯「賦值」跟「比較相等」。
x = 5       # 把 5 存進 x,這叫「賦值」
print(x)    # 輸出 5
print(x == 5)  # True,因為 x 的值等於 5
print(x = 5)   # 錯誤!這裡不能用賦值
💡 小提醒:
= 用來「指定」變數的值。== 用來「判斷」兩個值是否相等。我們先來看個生活化的例子!
假設你去 ATM 提款,輸入的密碼必須跟設定密碼相符,才能進入下一步。
password = "1234"
user_input = input("請輸入密碼: ")
if user_input == password:
    print("密碼正確,歡迎使用 ATM!")
else:
    print("密碼錯誤,請重新輸入。")
這裡就用到了比較運算子 ==,
幫我們判斷「輸入的密碼」是不是跟「設定密碼」一樣。
我這邊有另外做一張投影片解釋「關係vs邏輯」!可以參考一下~

我們來看一下範例:(可以發現在關係運算上面的輸出結果會是布林值!)
a = 10
b = 7
print(a > b)    # True
print(a == b)   # False
print(a != b)   # True
布林值也可以參與比較,True 會被視為 1,False 會被視為 0:
a = True
b = False
print(a == b)   # False,True 不等於 False
print(a != b)   # True,兩者不同
print(a > b)    # True,True>False 相當於 1>0
print(a >= b)   # True,1 >= 0
print(a < b)    # False,1<0 不成立
print(a <= b)   # False,1<=0 不成立
上面介紹的關係運算子是屬於「數值」層面的,
接下來我會再多介紹有關「序列關係運算」以及「物件類別關係運算」。
有時候我們想知道,一個元素是不是存在於某個集合(list、字串、tuple…)裡,
這時候就用 in 或 not in。
| 符號 | 說明 | 範例 | 結果 | 
|---|---|---|---|
| in | 判斷元素是否存在 | "a" in "apple" | True | 
| not in | 判斷元素是否不存在 | "b" not in "apple" | True | 
範例:字串與清單
word = "apple"
print("a" in word)       # True,因為 "a" 在 "apple" 裡
print("b" not in word)   # True,因為 "b" 不在 "apple" 裡
fruits = ["apple", "banana", "cherry"]
print("banana" in fruits)     # True,因為banana有出現在fruits這個list
print("orange" not in fruits) # True,因為orange沒有出現在fruits這個list
is 與 is not 用來判斷 兩個物件是否為同一個物件(比的是記憶體位址),而不是單純值相等。
| 符號 | 說明 | 範例 | 結果 | 
|---|---|---|---|
| is | 是否為同一個物件 | a is b | True / False | 
| is not | 是否不是同一個物件 | a is not b | True / False | 
我們來看一下範例:
x = [1, 2, 3]
y = [1, 2, 3]
z = x
print(x == y)    # True,因為內容一樣
print(x is y)    # False,雖然值相同,但記憶體位置不同
print(x is z)    # True,因為 z 指向的就是 x
print(x is not y) # True
💡 小提醒:
== 比較的是「值是否相等」is 比較的是「是不是同一個物件」這兩個常常被新手搞混!(我也踩過這個坑)
光會比較還不夠,生活中的問題通常更複雜。
例如:「我今天有沒有時間看電影?」可能取決於兩件事:
這時候,我們就需要 邏輯運算子 來把條件組合在一起。
我一樣做了一個統整的slide給大家做參考!

(可以參考一下表格下方的紅字(口訣)!到目前爲止我也都是這樣背)
| 運算子 | 說明 | 範例 | 結果 | 
|---|---|---|---|
| and | 兩者都為真,結果才為真 | True and False | False | 
| or | 只要有一個為真,結果就為真 | True or False | True | 
| not | 將布林值反轉 | not True | False | 
範例:
a = True
b = False
print(a and b)  # False,因為兩個條件不全為真
print(a or b)   # True,只要一個為真即可
print(not a)    # False,把 True 反轉成 False
Python 沒有內建關鍵字 xor,但我們可以用 位元運算子 ^ 來達到布林的互斥或效果:
True
False
| 運算子 | 說明 | 範例 | 結果 | 
|---|---|---|---|
| ^ | XOR,僅一真一假時才為真 | True ^ False | True | 
a = True
b = False
c = True
print(a ^ b)  # True,一真一假
print(a ^ c)  # False,因為兩個都 True
print(b ^ b)  # False,因為兩個都 False
💡 小提醒:
^ 在數字中是「位元 XOR」,但套用在布林值上,也能達成我們想要的「互斥或」。xor 常用在「只能選一個」的邏輯,例如:會員登入方式(用 Google 或 Facebook 登入,但不能兩個同時)。接下來,我們來一起看範例!
我們來檢查四個人的身高,看看誰的身高是否介於 180 到 185 公分之間;
同時也檢查體重是否符合標準範圍(70 到 90 公斤之間)。
# 四個人的身高 (公分)
h1, h2, h3, h4 = 175, 180, 184, 190
print(h1 >= 180 and h1 <= 185)   # False,175 不在範圍內
print(h2 >= 180 and h2 <= 185)   # True,180 在範圍內
print(h3 >= 180 and h3 <= 185)   # True,184 在範圍內
print(h4 >= 180 and h4 <= 185)   # False,190 太高了
# 四個人的體重 (公斤)
w1, w2, w3, w4 = 95, 85, 75, 65
print(70 < w1 < 90)   # False,95 超標
print(70 < w2 < 90)   # True,85 剛剛好
print(70 < w3 < 90)   # True,75 剛好符合
print(70 < w4 < 90)   # False,65 太輕了
接下來,我們把「not」跟「and / or」搭配起來玩一玩:
# 四個人的身高、體重
h1, h2, h3, h4 = 172, 179, 183, 188
w1, w2, w3, w4 = 92, 85, 78, 68
print(not h2 < 180)  
 # True,因為 h2=179,不滿足 <180 → 反轉後為 True
 
print(not h3 < 180)                  
# True,183 本來就 >180,反轉後仍然 True
print(not (h1 > 180 and w1 < 80))    
# True,因為 h1>180 不成立 → and 為 False → not 變 True
print(not h2 > 180 or not w2 < 80)   
# True,h2=179 不大於180 → not True → or 判斷整體為 True
print(not (h3 > 180 or w3 < 80))    
 # False,因為 h3=183>180 → or 為 True → not False
 
print(not h4 > 180 and not w4 < 80)  
# False,h4=188>180 → not False;w4=68<80 → not False;最後 and False
今天我們正式進入了程式設計裡「邏輯思考」的領域。
從 比較運算子(==, !=, >, <, in, is…)到 邏輯運算子(and, or, not, xor),你會發現 Python 不只會算數學,還能幫我們回答各種「是或否」的問題。
程式的力量就在這裡 —— 它不只是計算,還能幫我們「做判斷」,替我們思考。
今天我們玩的練習題,就像在幫一群人做健康檢查一樣:
程式自動判斷身高、體重是否在標準範圍,甚至還能反轉條件(用 not),就好像醫師說「雖然超過180公分,但體重沒有過輕就算合格」。
這樣的邏輯組合,在未來的專案中會非常常見完全離不開!!
掌握了這些運算子之後,你已經有能力開始「寫出會思考的程式」了。
回想當初自己第一次學這些比較與邏輯運算子的時候,真的是一團亂。
最常犯的錯就是把 = 跟 == 搞混,原本只是想要「比較」,結果卻寫成「賦值」,程式直接報錯。
那時候心裡超崩潰!!
更崩潰的是後面還遇到 and、or、not、甚至 xor。
但後來我慢慢發現,其實這些東西在很多情境都會用到:
not,常常能幫忙處理「反向」的邏輯,少寫很多程式碼。雖然一開始真的很混亂,但現在回頭看,這些比較與邏輯運算子就像是「程式的大腦」。
只要我下對指令,程式就能像小機器人一樣,幫我思考、幫我判斷。
而這種感覺,真的是從單純做數學計算,進化到能寫「有智慧的程式」的關鍵轉折。
Day8,我們要正式進入 if 條件判斷!
這會是你把「邏輯判斷」真正活用的第一步。
if 的基本寫法if-else 的選擇邏輯elif 的多重判斷更重要的是,我們會寫出第一個「能替你決定事情」的小程式,例如:
自動判斷一個分數是否及格
根據分數等級給出評語(A、B、C…)
判斷輸入的數字是奇數還是偶數
到了明天,你就會發現:
程式已經不再只是「輸入→計算→輸出」,而是開始像個「小助理」,能根據狀況替你選擇。
那麼我們就明天見囉!如果有任何問題,歡迎在底下留言~
若覺得內容還不錯的話!也可以幫我點個like,你們的支持也是我最大的動力~